// 在Electron客户端使用的上传函数
const fs = require('fs');
const path = require('path');

/**
 * 上传文件到服务器
 * @param {string} filePath 本地文件路径
 * @param {string} url 上传URL
 * @param {Object} options 其他选项
 * @returns {Promise<Object>} 上传结果
 */
export async function uploadFile(filePath, url, options = {}) {
  // 确保文件存在
  if (!fs.existsSync(filePath)) {
    throw new Error(`文件不存在: ${filePath}`);
  }

  // 创建FormData
  const formData = new FormData();

  // 添加文件 - 使用File API而不是流
  const fileBuffer = fs.readFileSync(filePath);
  const fileName = path.basename(filePath);
  const file = new File([fileBuffer], fileName, { type: getMimeType(fileName) });
  formData.append('file', file);

  // 添加其他选项
  for (const [key, value] of Object.entries(options)) {
    formData.append(key, value);
  }

  // 计算文件大小（用于日志）
  const stats = fs.statSync(filePath);
  const fileSizeMB = (stats.size / (1024 * 1024)).toFixed(2);

  console.log(`开始上传文件: ${path.basename(filePath)} (${fileSizeMB} MB) 到 ${url}`);

  try {
    // 使用fetch API发送上传请求
    const response = await fetch(url, {
      method: 'POST',
      body: formData,
      headers: {
        'Connection': 'keep-alive'
      }
    });

    if (!response.ok) {
      throw new Error(`上传失败: HTTP状态 ${response.status}`);
    }

    const data = await response.json();

    if (data.code !== 0) {
      throw new Error(`上传失败: ${data.message || '未知错误'}`);
    }

    console.log(`文件上传成功: ${path.basename(filePath)}`);
    return data;
  } catch (error) {
    console.error('文件上传失败:', error);
    throw error;
  }
}

// 辅助函数：获取文件的MIME类型
function getMimeType(filename) {
  const ext = path.extname(filename).toLowerCase();
  const mimeTypes = {
    '.mp4': 'video/mp4',
    '.avi': 'video/x-msvideo',
    '.mov': 'video/quicktime',
    '.wmv': 'video/x-ms-wmv',
    '.mp3': 'audio/mpeg',
    '.wav': 'audio/wav',
    '.ogg': 'audio/ogg',
    '.flac': 'audio/flac'
  };
  return mimeTypes[ext] || 'application/octet-stream';
}

/**
 * 上传模型视频
 * @param {string} videoPath 视频文件路径
 * @param {string} filename 文件名（可选）
 * @param {string} serverUrl 服务器URL
 * @returns {Promise<string>} 上传后的文件路径
 */
export async function uploadModelVideo(videoPath, filename, serverUrl) {
  const url = `${serverUrl}/apis/upload/upload/model`;
  const options = {};

  if (filename) {
    options.filename = filename;
  }

  const result = await uploadFile(videoPath, url, options);
  return {
    videoPath: result.data.videoPath,
    thumbnailUrl: result.data.thumbnailUrl
  };
}

/**
 * 上传音频文件
 * @param {string} audioPath 音频文件路径
 * @param {string} filename 文件名（可选）
 * @param {string} serverUrl 服务器URL
 * @returns {Promise<string>} 上传后的文件路径
 */
export async function uploadAudio(audioPath, filename, serverUrl) {
  const url = `${serverUrl}/apis/upload/upload/audio`;
  const options = {};

  if (filename) {
    options.filename = filename;
  }

  const result = await uploadFile(audioPath, url, options);
  return result.data; // 返回服务器的相对路径
}
